@强制输出
@输出名("抖音解析")
类 抖音解析 : 窗口

	@布局配置([[根布局=真,宽度=-1,高度=-1,纵向布局=真,背景颜色=-1576716]])
	变量 线性布局1 : 线性布局
	@布局配置([[父布局=线性布局1,宽度=-1,高度DP=45,左内边距DP=18,右内边距DP=18,@上外边距DP=10]])
	变量 相对布局1 : 相对布局
	@布局配置([[父布局=相对布局1,对齐方式=16,内容="解析",粗体=真,字体大小=20,字体颜色=-16777216,高度=-1,ID=1]])
	变量 文本框1 : 文本框
	@布局配置([[父布局=相对布局1,高度=-1,内容="短视频",对齐方式=16,@位于某组件右边=1,@左外边距DP=1,纵向偏移DP=2,字体大小=16,粗体=真]])
	变量 文本框2 : 文本框
	@布局配置([[父布局=相对布局1,高度=-1,@位于布局右边=真,对齐方式=17]])
	变量 线性布局2 : 线性布局
	@布局配置([[父布局=线性布局2,图片资源="../../../素材/Png/3916718.png",宽度DP=21,高度DP=21]])
	变量 图片框1 : 图片框
	@布局配置([[父布局=线性布局1,宽度=-1,高度DP=4,对齐方式=17,右内边距DP=20,左内边距DP=20,上内边距DP=1,下内边距DP=1]])
	变量 线性布局9 : 线性布局
	@布局配置([[父布局=线性布局9,宽度=-1,高度=-1]])
	变量 MAT进度条1 : MAT进度条
	@布局配置([[父布局=线性布局1,宽度=-1,高度=-2,对齐方式=1,纵向布局=真,左内边距DP=20,右内边距DP=20,上内边距DP=10]])
	变量 线性布局3 : 线性布局
	@布局配置([[父布局=线性布局3,宽度=-1,高度DP=40,圆角=75,卡片阴影=0,@下外边距DP=15]])
	变量 卡片布局1 : 卡片布局
	@布局配置([[父布局=卡片布局1,宽度=-1,高度=-1,透明度=1.0,背景颜色=-328966]])
	变量 线性布局4 : 相对布局
	@布局配置([[父布局=线性布局4,宽度=-1,高度=-1,左内边距DP=15,右内边距DP=3,上内边距DP=2,下内边距DP=2,@位于某组件左边=1]])
	变量 线性布局8 : 线性布局
	@布局配置([[父布局=线性布局8,宽度=-1,高度=-1,内边距=0,背景颜色=16777215,提示文本="",单行输入=真,对齐方式=16,字体颜色=-16777216,单行显示=真,字体大小=16,粗体=真,内容="",显示光标=真]])
	变量 输入内容 : 编辑框
	@布局配置([[父布局=线性布局4,宽度DP=60,高度=-1,ID=1,@位于布局左边=假,@位于布局右边=真]])
	变量 解析按钮 : 相对布局
	@布局配置([[父布局=解析按钮,圆角=75,卡片阴影=0,宽度=-1,横向偏移DP=-3,高度DP=35,@位于布局中间=真,@位于布局左边=假,@位于布局右边=真]])
	变量 卡片布局4 : 卡片布局
	@布局配置([[父布局=卡片布局4,宽度=-1,高度=-1,背景颜色=-11433996]])
	变量 线性布局7 : 线性布局
	@布局配置([[父布局=解析按钮,圆角=0,卡片阴影=0,高度DP=35,@位于布局中间=真,背景颜色=-11433996,@位于布局右边=假,宽度DP=25,@位于布局左边=真]])
	变量 卡片布局5 : 卡片布局
	@布局配置([[父布局=解析按钮,@位于布局中间=真,@位于布局右边=假,内容="解析",粗体=真,字体大小=17,@右外边距DP=5,字体颜色=-1,@位于布局左边=假,横向偏移DP=-2]])
	变量 文本框3 : 文本框
	@布局配置([[父布局=线性布局1,宽度=-1,高度=-1,左内边距DP=20,右内边距DP=20,对齐方式=17,下内边距DP=8]])
	变量 线性布局5 : 线性布局
	@布局配置([[父布局=线性布局5,宽度=-1,高度=-2,卡片阴影=0,圆角=24,可视=真,背景颜色=-1576716]])
	变量 播放器界面 : 卡片布局
	@布局配置([[父布局=播放器界面,宽度=-1,高度=-2,对齐方式=17,背景颜色=-1576716]])
	变量 线性布局6 : 线性布局
	@布局配置([[父布局=线性布局6,宽度=-1,高度=-2]])
	变量 视频播放器1 : 视频播放器

	变量 当前视频链接:文本
	变量 网络工具1 ： 网络工具
	变量 临时集合:文本集合
	变量 下载视频链接:文本
	变量 下载视频标题:文本
	变量 下载路径=取存储卡路径() + "/"+全局配置.软件名称+"/短视频解析/"
	事件 抖音解析:创建完毕()
		订阅事件()
		本对象.屏幕方向 = 1
		本对象.显示标题栏 =假
		本对象.状态栏字体黑色 = 真
		本对象.状态栏颜色 = -1576716
		本对象.导航栏颜色 = -1576716
		code getWindow().setSoftInputMode(2);
		播放器界面.可视 = 假
		MAT进度条1.起始颜色 = "#FF9CD4FC"
		MAT进度条1.结束颜色 = "#FF9CD4FC"
		MAT进度条1.背景颜色 = "#FFF3F3F3"
		MAT进度条1.显示进度文本 = 假
		MAT进度条1.进度高度 = 4
		MAT进度条1.显示背景 = 真
		MAT进度条1.进度圆角 = 8
	结束 事件

	事件 解析按钮:被单击()
		如果 输入内容.内容==""则
			弹出提示("请输入视频链接")
		否则
			视频播放器1.停止播放()
			播放器界面.可视 = 假
			显示加载("正在解析")
			当前视频链接=输入内容.内容
			开始解析()
		结束 如果

	结束 事件

	方法 开始解析()
		变量 请求头名称:文本 = "User-Agent"
		变量 请求头文本:文本 = "Mozilla/5.0 (Linux; Android 10; VOG-AL10 Build/HUAWEIVOG-AL10) AppleWebKit/537.36 (KHTML, like Gecko)  Chrome/83.0.4103.106 Mobile Safari/537.36"

		//这个表达式也可以 "http[s]?:\\/\\/[\\w.-]+[\\w\\/-]*[\\w.-]*\\??[\\w=&:\\-\\+\\%]*[/]"
		变量 表达式 = "http[s]?:\\/\\/[\\w.]+[\\w]*\\S+"
		变量 正则后链接 = 正则表达式.正则匹配(当前视频链接,表达式)
		如果 取数组长度(正则后链接) != 0 则
			网络工具1.添加请求头(请求头名称,请求头文本)
			网络工具1.取网页源码(正则后链接[0].到文本())
		否则	
			弹出提示("请输入正确的链接")
		结束 如果
	结束 方法
	事件 网络工具1:取网页源码结束(结果 : 文本,内容 : 字节[],cookie : 文本)
		变量 根对象 : JSON对象 = Unicode转中文(结果.截取文本("window._ROUTER_DATA = ","</script>"))
		变量 视频数据:JSON数组 = 根对象.取JSON对象("loaderData").取JSON对象("video_(id)/page").取JSON对象("videoInfoRes").取JSON数组("item_list")
		循环(i, 0, 视频数据.长度)
			变量 视频对象:JSON对象 = 视频数据.取JSON对象(i)
			变量 原始标题:文本 = 视频对象.取文本("desc")
			变量 备用标题:文本=视频对象.取文本("aweme_id")
			变量 视频链接文本:文本 = 视频对象.取JSON对象("video").取JSON对象("play_addr").取JSON数组("url_list").取文本(0).替换("playwm", "play")
			变量 解析真实链接1 : 解析真实链接
			解析真实链接1.解析短链接(本对象, 视频链接文本)
			事件 解析真实链接1:获取到真实链接(真实链接 : 文本)
				变量 视频链接=真实链接
				如果 原始标题==""则
					下载视频标题=备用标题+".mp4"
				否则
					下载视频标题=原始标题+".mp4"
				结束 如果
				如果 视频链接.开头为("h")==真 则
					关闭加载()
					播放器界面.可视 = 真
					下载视频链接=视频链接
					提交到新线程运行()
					视频播放器1.置播放路径(下载视频链接,真)
					视频播放器1.开始播放()
					结束提交到新线程()
				结束 如果
			结束 事件

		结束 循环

	结束 事件

	事件 图片框1:被单击()

		变量 提示:DX基础对话框
		提示.样式(DX样式.IOS)
		提示.标题("系统提示")
		提示.内容("点击视频即可下载，目前仅支持抖音")
		提示.按钮1("确定")
		提示.显示()

	结束 事件


	事件 视频播放器1:被单击()
		变量 下载提示:DX基础对话框
		下载提示.样式(DX样式.IOS)
		下载提示.标题("系统提示")
		下载提示.内容("你需要?")
		下载提示.按钮1("下载视频")
		下载提示.按钮2("取消")
		下载提示.显示()
		事件 下载提示:按钮1被单击() : 逻辑型
			下载提示.关闭()
			变量 等待框2 : DX加载
			变量 网络工具3:网络工具
			等待框2.内容("正在下载")
			等待框2.显示()
			网络工具3.下载(下载视频链接,下载路径+下载视频标题)
			事件 网络工具3:正在下载(进度 : 小数)
				等待框2.进度(进度/100)
			结束 事件
			事件 网络工具3:下载结束(cookie : 文本)
				提交到新线程运行()
				等待框2.类型(DX加载.类型_成功)
				等待框2.内容("下载成功")
				延时(1800)
				等待框2.关闭()
				结束提交到新线程()
			结束 事件
			返回 假
		结束 事件

	结束 事件

	//视频播放完成时触发该事件
	事件 视频播放器1:视频播放完成()
		视频播放器1.重新播放()
	结束 事件



	@虚拟方法
	方法 返回键被按下()
		如果 输入内容.内容==""则
			视频播放器1.停止播放()
			父对象.返回键被按下()
		否则
			输入内容.内容=""
		结束 如果
	结束 方法

结束 类

类 解析真实链接
	变量 浏览框1:浏览框 ? = 空
	方法 解析短链接(环境 : 安卓环境, 短链接 : 文本)
		//变量 浏览框1 : 浏览框 ? = 空
		code #浏览框1 = new #<浏览框>(#环境);
		浏览框1.网址 = 短链接
		事件 浏览框1:网页开始加载(网址 : 文本)
			//浏览框1.停止加载()
			获取到真实链接(网址)
			浏览框1.网址=""
		结束 事件
	结束 方法

	定义事件 获取到真实链接(真实链接 : 文本)
结束 类